
#pragma once


#ifndef _AES_H
#define _AES_H

#ifdef __cplusplus
extern "C" {
#endif

	/**
	* \brief          AES context structure
	*/
	typedef struct
	{
		unsigned long erk[64];     /*!< encryption round keys */
		unsigned long drk[64];     /*!< decryption round keys */
		int nr;                    /*!< number of rounds      */
	}
	aes_context;

	/**
	* \brief          AES key schedule
	*
	* \param ctx      AES context to be initialized
	* \param key      the secret key
	* \param keysize  must be 128, 192 or 256
	*/
	void aes_set_key(aes_context *ctx, unsigned char *key, int keysize);

	/**
	* \brief          AES block encryption (ECB mode)
	*
	* \param ctx      AES context
	* \param input    plaintext  block
	* \param output   ciphertext block
	*/
	void aes_encrypt(aes_context *ctx,
		unsigned char input[16],
		unsigned char output[16]);

	/**
	* \brief          AES block decryption (ECB mode)
	*
	* \param ctx      AES context
	* \param input    ciphertext block
	* \param output   plaintext  block
	*/
	void aes_decrypt(aes_context *ctx,
		unsigned char input[16],
		unsigned char output[16]);

	/**
	* \brief          AES-CBC buffer encryption
	*
	* \param ctx      AES context
	* \param iv       initialization vector (modified after use)
	* \param input    buffer holding the plaintext
	* \param output   buffer holding the ciphertext
	* \param len      length of the data to be encrypted
	*/
	void aes_cbc_encrypt(aes_context *ctx,
		unsigned char iv[16],
		unsigned char *input,
		unsigned char *output,
		int len);
	unsigned long aes_cbc_encrypt_pkcs5(aes_context *ctx,
		unsigned char iv[16],
		unsigned char *input,
		unsigned char *output,
		int len);

	/**
	* \brief          AES-CBC buffer decryption
	*
	* \param ctx      AES context
	* \param iv       initialization vector (modified after use)
	* \param input    buffer holding the ciphertext
	* \param output   buffer holding the plaintext
	* \param len      length of the data to be decrypted
	*/
	void aes_cbc_decrypt(aes_context *ctx,
		unsigned char iv[16],
		unsigned char *input,
		unsigned char *output,
		int len);


#ifdef __cplusplus
}
#endif

#endif 
